/**
 * @Description: 函数工具装饰器
 * @author Beon
 * @date 2021/1/4
*/
export class ClassTool {

    /**
     * 改变函数指向为当前类
     * @param {*} target 当前对象
     * @param {String} propertyKey 函数名称
     * @param {PropertyDescriptor} descriptor 函数详细对象
     */
    static saveThis<T>(target: T, propertyKey: string, descriptor: PropertyDescriptor): void {
        // 保存函数
        const setFunction = descriptor.value;

        descriptor.value = async (...arg): Promise<void> => {
            await setFunction.apply(target, arg);
        };
    }

    /**
     * 返回实例化当前对象
     * @param {*} Target 传递的参数类
     * @param {String} propertyKey 传递的参数名
     * @returns {void}
     */
    // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
    static newSelf(Target: any, propertyKey: string): void {
        Target[propertyKey] = new Target();
    }
}
